begin;
create table typy_obiektow (
	id serial primary key,
	opis varchar(100) not null
);

create table obiekty (
	id serial primary key,
	nazwa varchar(100) not null,
	adres varchar(100) not null,
	dlugosc numeric(6,3) not null,
	szerokosc numeric(6,3) not null,
	telefon varchar(15) not null,
	strona_www varchar(100),
        typ int not null references typy_obiektow
);

create table atrakcje (
	id serial primary key,
	opis varchar(100) not null
);

create table obiekty_atrakcje (
	obiekt int not null references obiekty,
	atrakcja int not null references atrakcje,
	unique(obiekt,atrakcja)
);

create table komentarze (
	id serial primary key,
	data date not null default CURRENT_DATE,
	obiekt int not null references obiekty,
	komentarz varchar(1000) not null
);

create table obiekty_pokoje (
	obiekt int not null references obiekty,
	ile_miejsc int not null check(ile_miejsc>0),
	ilosc int not null check(ilosc>0),
	cena int not null check(cena >0)
);

create table wyposazenie (
	id serial primary key,
	opis varchar(100) not null
);

create table obiekty_wyposazenie (
	obiekt int not null references obiekty,
	wyposazenie int not null references wyposazenie,
	unique(obiekt,wyposazenie)
);

create table miasta (
	id serial primary key,
	nazwa varchar (100) not null,
	dlugosc numeric(6,3) not null,
	szerokosc numeric(6,3) not null
);

CREATE or replace FUNCTION calculate_distance_plpgsql(lat_1 float, lon_1 float, lat_2 float, lon_2 float) RETURNS float AS $$
BEGIN
RETURN 1.609*3963.0 * acos(sin(lat_1 / 57.2958) * sin(lat_2 / 57.2958) + cos(lat_1 / 57.2958) * cos(lat_2 / 57.2958) * cos((lon_2 / 57.2958) - (lon_1 / 57.2958)));   
END;                
$$ LANGUAGE plpgsql;
end;
